طراحی بازی snake (مار)
نوشته شده توسط : Roh

 اول از همه گفتم که ما به یک آرایه احتیاج داریم ( البته اون رو مقدار دهی اولیه کردم. محل اولیه مار. که لازم هم نبود. چون تو یه تابع مقداردهی میشه.)

int snake[500][2]={{6,2},{5,2},{4,2},{3,2},{2,2}}; // 0 for x 1 for y

 و اینکه بدونیم زمین بازی چقدریه. یعنی چند در چنده؟

#define W 25

#define H 25

همچنین باید هر بار که بازی شروع میشه و هربار که مار غذا رو میخوره مختصات غذای بعدی رو داشته باشیم. (نمیدونم چرا اسم این غذا سیب هست؟ پس اگه توی برنامه به کلمه apple برخوردید زیاد تعجب نکنید!)

int appx,appy; // apple position

با خوردن هر غذا طول مار یکی اضافه میشه. برای سادگی کار مختصات سر مار رو هم ذخیره می کنیم. البته با توجه به نحوه ی ذخیره سازی بدن مار در آرایه، خونه صفرم آرایه مختصات سر مار رو ذخیره می کنه. باید هر دفعه به اندازه طول مار (که توی یه متغییر ذخیره شده) در مختصاتهای بدن مار حروفی چاپ می کنیم تا مار چاپ بشه.

یه متغییر هم داریم برای کنترل سرعت مار (SPEED).

کل متغییرهایی که قبل از تعریف توابع لازمه اینا هستن:

#include

#include

#include

#include

 

#define W 25

#define H 25

 

int snake[500][2]={{6,2},{5,2},{4,2},{3,2},{2,2}}; // 0 for x 1 for y

int snlen=5;

int x=6,y=2;

int dir=1; // right=1 up=2 left=3 down=4

int appx,appy; // apple position

int eata;

int SPEED=70;

اولین تابعی که معرفی می کنم تابع printwall() هست که از اسمش معلومه که دیواره های کنار صفحه رو رسم می کنه:

void printwall()

{

 int i,j;

 textcolor(1);

 for (i=1 ; i<=W+1 ; i++)

 for (j=1 ; j<=H+1 ; j++)

 {

 if ((i==1 || i==W+1) || (j==1 || j==H+1))

 {

 gotoxy(i,j);

 cprintf("*");

 }

 }

}

 

تابع بعدی تابعیه که مار رو رسم می کنه:

void printsnake()

{

 int i;

 textcolor(11);

 for (i=1 ; i< snlen ; i++ )

 {

 gotoxy(snake[i][0],snake[i][1]);

 cprintf("X");

 }

 textcolor(12);

 gotoxy(snake[0][0],snake[0][1]);

 cprintf("O");

}

تابع بعدی تابعیه که سیب (غذا) رو در محلی به صورت رندوم قرار میده. ولی دقت داشته باشید که این محل رندوم روی بدن مار نباشه، که توی تابع این موضوع هم بررسی میشه:

void insertapple()

{

 int ax,ay,t,i;

 do{

 ax=random(W-2)+2;

 ay=random(H-2)+2;

 t=0;

 for (i=0 ; i

 if (ax==snake[i][0] && ay==snake[i][1])

 {

 t=1;

 break;

 }

 } while (t);

 appx=ax;

 appy=ay;

 gotoxy(ax,ay);

 textcolor(11);

 cprintf("0");

}

خوب حالا احتیاج به یه تابع داریم تا هر دفعه که فراخوانی میشه بازی جدیدی شروع بشه. یعنی تنظیمات اولیه بازی برگرده:

void newgame()

{

 clrscr();

 snake[0][0]=6; snake[0][1]=2;

 snake[1][0]=5; snake[1][1]=2;

 snake[2][0]=4; snake[2][1]=2;

 snake[3][0]=3; snake[3][1]=2;

 snake[4][0]=2; snake[4][1]=2;

 x=6;y=2;

 snlen=5;

 dir=1;

 printwall();

 insertapple();

 printsnake();

}

یکی از مهمترین موضوعاتی که توی بازی اسنیک وجود داره اینه که با حرکت مار به جلو تمام مختصاتهای قبلی مار باید به جلو حرکت داده شوند یا به عبارت دیگه باید شیفت داده شوند:

void shiftsnake()

{

 int i;

 for (i=snlen-2 ; i>=0 ; i--)

 {

 snake[i+1][0]=snake[i][0];

 snake[i+1][1]=snake[i][1];

 }

 snake[0][0]=x;

 snake[0][1]=y;

}

تابع زیر مشخص میکنه که مار به سیب رسیده و اون رو خورده یا نه:

int eatapple()

{

 if (x==appx && y==appy)

 {

 if (snlen<499) snlen++;

 return 1;

 }

 return 0;

}

تابع زیر هم مشخص میکنه که مار با خودش برخورد کرده یا نه:

int catchitself()

{

 int i;

 for (i=1 ; i

 if (x==snake[i][0] && y==snake[i][1])

 return 1;

 return 0;

}

این هم بزگترین تابع بازی که کل بازی توی اون جریان داره.

درمورد اینکه مار به کدوم طرف حرکت میکنه باید یه متغییر تعریف کرد و هر دفعه بررسی کرد که کدوم جهت رو نشون میده و بسته به اون جهت مختصات سر مار رو تغییر داد. در این تابع این متغییر dir هست که عددهای 1 و 2 و 3 و 4 بترتیب نشان دهنده راست، بالا، چپ و پایین هستند.

با زدن کلیدهای جهت دار صفحه کلید باید عددی که در dir ذخیره شده تغییر داد. مثلا اگه مار به سمت بالا حرکت میکنه (مقدار dir عدد 4 هست) دیگه نمیتونه به پایین برگرده (یعنی dir نمیتونه 1 بشه). و همینطور در مورد بقیه جهتها.

قبل از تابع eatapple سه خط کد هست که دم مار رو پاک می کنن. یعنی با رنگ زمینه که سیاه هستش یک حرف چاپ میشه. چون مار یکی به سمت جلو حرکت کرده و اگه این کار رو نکنیم دم مار هیچ وقت پاک نمیشه و رد پای مار روی صفحه باقی میمونه.

void play()

{

 delay(3000);

 char ch=1;

 int i;

 do{

  while (!kbhit()){

 switch (dir){

 case 1: // right

 x++;

 if (x==W+1) x=2;

 break;

 case 2: // up

 y--;

 if (y==1) y=H;

 break;

 case 3: // left

 x--;

 if (x==1) x=W;

 break;

 case 4: // down

 y++;

 if (y==H+1) y=2;

 break;

 }

 gotoxy(snake[snlen-1][0],snake[snlen-1][1]);

 textcolor(0);

 cprintf("O");

 // eat apple;

 eata=eatapple();

 // shift snake position

 shiftsnake();

 printsnake();

 if (eata) insertapple();

 // catch itself

 if (catchitself())

 {

 delay(3000);

 return;

 }

 delay(SPEED);

 }

 ch=getch();

 if (ch==0)

 ch=getch();

 switch (ch){

 case 80: // down key

 if (dir!=2) dir=4;

 break;

 case 72: // up key

 if (dir!=4) dir=2;

 break;

 case 77: // right key

 if (dir!=3) dir=1;

 break;

 case 75: // left key;

 if (dir!=1) dir=3;

 break;

 }

 if (kbhit())

 if (getch()==0)

 getch();

 } while (ch!=27);

}

میمونه طراحی یه منو که قبل از بازی ازمون بخواد چه کاری انجام بدیم:

void menu()

{

 char ch;

 do{

 clrscr();

 textcolor(14);

 cprintf("[1] New Game");

 printf("\n");

 cprintf("[2] Change Speed");

 printf("\n");

 cprintf("[3] Exit");

 ch=getch();

 switch (ch){




:: موضوعات مرتبط: پروژه برنامه نویسی ++c , ,
:: بازدید از این مطلب : 2586
|
امتیاز مطلب : 5
|
تعداد امتیازدهندگان : 1
|
مجموع امتیاز : 1
تاریخ انتشار : پنج شنبه 7 دی 1391 | نظرات ()
مطالب مرتبط با این پست
لیست
می توانید دیدگاه خود را بنویسید


نام
آدرس ایمیل
وب سایت/بلاگ
:) :( ;) :D
;)) :X :? :P
:* =(( :O };-
:B /:) =DD :S
-) :-(( :-| :-))
نظر خصوصی

 کد را وارد نمایید:

آپلود عکس دلخواه: